package com.foundationmade.newbiz.business.founder.controller;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.annotation.security.RolesAllowed;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.foundationmade.newbiz.business.founder.domain.Founder;
import com.foundationmade.newbiz.business.founder.domain.FounderHistory;
import com.foundationmade.newbiz.business.founder.service.FounderService;

import devcken.datatables.serverside.FromServer;
import devcken.datatables.serverside.SortQuery;
import devcken.datatables.serverside.ToServer;
import devcken.hibernate.query.OrderBy;
import devcken.utility.Pair;

/**
 * 창업주 관련 요청을 처리하기 위한 인터페이스를 제공한다. 
 * @author Devcken
 */
@Controller
@RequestMapping("/founder")
public class FounderController
{
	private final static Logger logger = LoggerFactory.getLogger(FounderController.class);
	
	/**
	 * 매장 관련 DAO를 주입받는다.
	 */
	@Resource(name = "founderService")
	private FounderService _founderService;
	
	/**
	 * 창업주 메인 페이지로 이동한다.
	 * @return 창업주 메인 페이지에 대한 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RolesAllowed("ROLE_ADMIN")
	@RequestMapping(value = StringUtils.EMPTY, method = { RequestMethod.GET, RequestMethod.POST })
	public ModelAndView founderMain()
	{
		return new ModelAndView("founder.list");
	}
	
	/**
	 * 창업주 편집 페이지로 이동한다.
	 * @param founderId 편집하려는 창업주의 아이디가 전달된다. 새 창업주를 등록하려는 경우, 0으로 전달된다.
	 * @return 창업주 편집 페이지에 대한 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RolesAllowed("ROLE_ADMIN")
	@RequestMapping(value = "/write", method = RequestMethod.GET)
	public ModelAndView founderWrite(@RequestParam(value = "founderId", required = false, defaultValue = "0") Long founderId)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		map.put("founderId", founderId);
		
		return new ModelAndView("founder.write", map);
	}
	
	/**
	 * 창업주 조회 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param searchCondition 창업주 조회에 대한 검색 조건이 전달된다. 
	 * @return 조회된 창업주 목록을 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RolesAllowed("ROLE_ADMIN")
	@RequestMapping(value = "/list", method = RequestMethod.POST)
	public ModelAndView listFoundations(HttpServletRequest request,
			ToServer toServer,
			Founder searchCondition)
	{
		FromServer map = new FromServer();
		
		try
		{
			List<Pair<String, OrderBy>> sortConditions = SortQuery.getSortConditions(request, toServer.getiSortingCols());
			
			List<Founder> founders = new ArrayList<Founder>();
			
			Integer filteredCount = this._founderService.listFounders(searchCondition,
					toServer.getPage(),
					toServer.getiDisplayLength(),
					sortConditions,
					founders);
			
			map.setiTotalRecords(this._founderService.countFounders());
			map.setiTotalDisplayRecords(filteredCount);
			
			map.put("founders", founders);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
	
	/**
	 * 창업주 열람 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param founderId 열람하려는 창업주의 아이디가 전달된다.
	 * @return 열람된 창업주 정보를 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RolesAllowed("ROLE_ADMIN")
	@RequestMapping(value = "/get", method = RequestMethod.POST)
	public ModelAndView getFounder(HttpServletRequest request, Long founderId)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{
			Founder founder = this._founderService.getFounder(founderId);
			
			map.put("founder", founder);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
	
	/**
	 * 창업주 저장 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param founder 저장하려는 창업주 정보가 전달된다.
	 * @return 창업주 저장 결과를 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RolesAllowed("ROLE_ADMIN")
	@RequestMapping(value = "/save", method = RequestMethod.POST)
	public ModelAndView saveFounder(HttpServletRequest request, Founder founder)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{
			if (StringUtils.isEmpty(founder.getFounderName().trim()))
			{
				map.put("result", false);
				
				return new ModelAndView("jsonView", map);
			}
			
			boolean result = this._founderService.saveFounder(founder);
			
			map.put("result", result);
			map.put("founder", founder);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
	
	/**
	 * 창업주 작업 내역 목록 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param toServer 목록 관련 스터프들이 전달된다.
	 * @param founderId 창업주 아이디가 전달된다.
	 * @return 창업주 작업 내역 목록을 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RolesAllowed("ROLE_ADMIN")
	@RequestMapping(value = "/history/list", method = RequestMethod.POST)
	public ModelAndView listFounderHistories(HttpServletRequest request,
			ToServer toServer,
			@RequestParam(value="founderId", required = true) Long founderId)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{
			List<FounderHistory> founderHistories = this._founderService.listFounderHistories(founderId);
			
			map.put("histories", founderHistories);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
	
	/**
	 * 창업주 작업 내역 저장 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param founderHistory 저장하려는 창업주 작업 내역이 전달된다.
	 * @return 창업주 작업 내역 저장 결과를 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RolesAllowed("ROLE_ADMIN")
	@RequestMapping(value = "/history/save", method = RequestMethod.POST)
	public ModelAndView saveFounderHistory(HttpServletRequest request,
			FounderHistory founderHistory,
			@RequestParam(value = "founderId", required = true)Long founderId)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{
			Founder founder = this._founderService.getFounder(founderId);
			
			founderHistory.setFounder(founder);
			
			boolean result = this._founderService.saveFounderHistory(founderHistory);
			
			map.put("result", result);
			map.put("founderHistory", founderHistory);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
	
	/**
	 * 창업주 작업 내역 삭제 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param founderHistoryId 삭제하려는 창업주 작업 내역의 아이디가 전달된다.
	 * @return 창업주 작업 내역 삭제 결고를 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RolesAllowed("ROLE_ADMIN")
	@RequestMapping(value = "/history/delete", method = RequestMethod.POST)
	public ModelAndView deleteFounderHistory(HttpServletRequest request,
			Long founderHistoryId)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{
			boolean result = this._founderService.deleteFounderHistory(founderHistoryId);
			
			map.put("result", result);
			map.put("founderHistoryId", founderHistoryId);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
}